package com.lxw.multidb.controller.dataharvest.dto;

import cn.tannn.jdevelops.result.bean.SerializableBean;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.*;

/**
 * 数据收割-规则字段参数
 * <p>
 * 用于定义源字段到目标字段的映射规则，包括字段名映射和类型转换规则
 * </p>
 *
 * @author lxw
 * @version 1.0
 * @date 2025-07-11 11:23:13
 */
@Schema(description = "数据收割-规则字段参数")
@ToString
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class FieldRule extends SerializableBean<FieldRule> {

    /**
     * 来源字段
     * <p>源表中的字段名称</p>
     */
    @Schema(description = "来源字段（源表字段名）", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_name")
    @NotBlank(message = "来源字段不能为空")
    private String sourceField;

    /**
     * 目标字段
     * <p>目标表中的字段名称</p>
     */
    @Schema(description = "目标字段（目标表字段名）", requiredMode = Schema.RequiredMode.REQUIRED, example = "username")
    @NotBlank(message = "目标字段不能为空")
    private String field;

    /**
     * 字段名称
     * <p>字段的中文描述名称，用于日志和显示</p>
     */
    @Schema(description = "字段名称（中文描述）", example = "用户名")
    private String name;

    /**
     * 数据库字段类型
     * <p>
     * 用于指定目标字段的数据类型，系统会根据此类型进行值转换。
     * 支持的类型：
     * <ul>
     *   <li><b>bigint</b> - 长整型，转换为Long</li>
     *   <li><b>int/integer</b> - 整型，转换为Integer</li>
     *   <li><b>varchar</b> - 变长字符串，需配合length使用，超长会截断</li>
     *   <li><b>text</b> - 文本类型</li>
     *   <li><b>longtext/mediumtext</b> - 长文本类型</li>
     *   <li><b>date</b> - 日期类型，转换为java.sql.Date</li>
     *   <li><b>datetime/timestamp</b> - 日期时间类型，转换为java.sql.Timestamp</li>
     *   <li><b>decimal/numeric</b> - 高精度数值，转换为BigDecimal</li>
     *   <li><b>double</b> - 双精度浮点数</li>
     *   <li><b>float</b> - 单精度浮点数</li>
     *   <li><b>boolean/bool/tinyint</b> - 布尔类型</li>
     * </ul>
     * 如果不指定类型，则保持原值不转换。
     * </p>
     */
    @Schema(
            description = "数据库字段类型，支持: bigint、int、varchar、text、longtext、date、datetime、decimal、double、float、boolean",
            example = "varchar"
    )
    private String type;

    /**
     * 字段长度
     * <p>
     * 当 type == varchar 时必填，指定字段的最大长度。
     * 如果源数据超过此长度，将被截断。
     * 默认值为255。
     * </p>
     */
    @Schema(description = "字段长度，type=varchar时使用，默认255", example = "255")
    private Integer length;

    /**
     * 判断是否需要进行类型转换
     *
     * @return true表示需要类型转换
     */
    public boolean needTypeConversion() {
        return type != null && !type.trim().isEmpty();
    }

    /**
     * 获取有效长度
     * <p>如果未设置长度，返回默认值255</p>
     *
     * @return 字段长度
     */
    public int getEffectiveLength() {
        return (length != null && length > 0) ? length : 255;
    }
}